// 注册路由器
const express = require('express');
// const db = require('../db/index');
const Users = require('../models/users');

// const _ = require('lodash');
const jwt = require('jsonwebtoken');
const cookieParser = require('cookie-parser');
const secret = 'abc';
// 创建路由器对象
const router = new express.Router();


router.use(cookieParser());
// 数据库连接
/* router.use('/', async (req, res, next) => {
    await db;
    next();
}) */
router.post('/register', async (req, res) => {
    console.log(req.body);
    const {
        user_name,
        password
    } = req.body;

    const user_name_reg = /^[A-z0-9]{3,12}$/;
    const password_reg = /^[A-z0-9]{3,12}$/;
    // user_name_reg.test(user_name.trim());
    // password_reg.test(password.trim());
    if (user_name_reg.test(user_name.trim()) && password_reg.test(password.trim())) {
        // 数据验证 数据校验  符合要求    用户名是唯一     先去查询数据库中的数据，如果没有数据   存放到数据库，如果有数据 返回用户名已存在
        // 连接数据库 创建模型对象  数据库的增删改查
        // 大部分查询、更新  one是对象 不写或many就是数组
        // 先去查询users中是否存在该用户名
        const result_find = await Users.findOne({
            user_name
        });

        console.log(result_find);
        if (result_find) {
            res.send('用户名已存在');
        } else {
            // 往users集合中存放数据
            const result = await Users.create({
                user_name,
                password
            });
            console.log(result);
        }

        // res.send('注册成功！');
    } else {
        res.send('用户名或者密码不配！！')
    }
    /* 
    分析逻辑
    用户流程
    输入用户名 密码  点击注册按钮  ①成功 注册成功 ②失败 错误
    开发人员逻辑流程
    浏览器端post发送用户名 密码  
    通过req.body获取数据
    数据验证 数据校验  符合要求    用户名是唯一     先去查询数据库中的数据，如果没有数据   存放到数据库，如果有数据 返回用户名已存在
                      不符合要求 返回响应数据格式错误 
    数据校验 前台校验  1
            后台校验  2 正则表达式
    
    */



    // res.send('注册成功！！');
});
// 登录
router.post('/login', async (req, res) => {
    // 逻辑
    /* 
    用户逻辑
    输入用户名 密码 点击登录   登录成功   用密码或密码错误

    开发人员的流程
    ①获取post请求体中参数  req.body
    ②根据post请求的参数查询数据库中对应的数据文档  找到 执行③  找不到（实际上是用户名不存在，返回 用户名或密码错）
    ③ 找到  那req.body同数据库返回的文档进行对比  一致 登录成功
      找不到  直接用户名密码错误  
    
    
    */

    // console.log(req.body);
    const user = req.body;
    // 查询对应数据
    const result = await Users.findOne({
        user_name: user.user_name
    }, {
        _id: 0,
        __v: 0
    });
    console.log(result);
    if (result) {
        // user  result进行对比  两个对象  
        // 介绍 lodash
        // {user_name:'jack',password:'123123'}
        /* const test = {
            user_name: 'jack',
            password: '123123'
        } */
        // const loadsh_test = _.isEqual(user, result);
        // console.log(loadsh_test);
        if (user.user_name == result.user_name && user.password == result.password) {
            // 七天免登陆
            // Jsonwebtoken  创建token
            jwt.sign(user, secret, {
                expiresIn: '1h'
            }, (err, token) => {
                if (!err) {
                    console.log(token);
                    // 产生token之后 token需要返回到前台 跟随cookie   作为响应头中的cookie返回到前台
                    res.cookie('token', token, {
                        maxAge: 1000 * 60 * 60
                    })
                    res.send('登录成功！！');
                } else {
                    console.log(err);
                    res.send('用户名或密码错误');
                }
            })

            // res.send('登录成功！！');
        } else {
            res.send('用户名或密码错误');
        }
    } else {
        // 用户名错误
        res.send('用户名或密码错误');
    }




})
//登录页面在当前的域下 ，document.cookie  token
router.get('/tokenTest', (req, res) => {
    console.log(req.cookies);
    // 验证token  token核验  session  {abc:[{},{},{},{}]}
    jwt.verify(req.cookies.token, secret, (err, data) => {
        if (!err) {
            console.log(data);
            res.send('获取到cookies');
        } else {
            console.log(err);
            res.send('请去登录页面重新登录！！');
        }
    })
    // res.send('test');
})

/* 
单角色登录逻辑
侯邦  用户名 密码 点击登录 → 验证没有问题产生token → 将token作为cookie中的token，传递给前台→ document.cookie获取token → 免登陆

多角色登录逻辑
侯邦 用户名 密码 点击登录 → 验证没有问题产生token → 将token作为cookie中的token，传递给前台→ document.cookie获取token  token存储到localstorage → 发送请求前，重新设置cookie  document.cookie = localstorage中某个token    → 免登陆   个人中心 切换用户

主页上有一个功能 选用户 localstorage中有多个token就有多少个用户  

大牛 用户名 密码 点击登录 → 验证没有问题产生token → 将token作为cookie中的token，传递给前台→ document.cookie获取token  token存储到localstorage，另一个token → 发送请求前，重新设置cookie  document.cookie = localstorage 另一个中某个token    → 免登陆






*/


// 将路由器对象暴露出去
module.exports = router;